package cn.dai.servlet;

import cn.dai.dao.*;
import cn.dai.pojo.*;
import cn.dai.service.*;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

/**
 * @author ArkD42
 * @file RBAC
 * @create 2020 - 06 - 11 - 12:11
 *
 * http://localhost:8080/RBAC/login
 */

@WebServlet("/login")
public class LoginServlet extends BaseServlet{

    UserService userService = new UserServiceImpl(new UserDaoImpl());
    RoleService roleService = new RoleServiceImpl(new RoleDaoImpl());
    MenuService menuService = new MenuServiceImpl(new MenuDaoImpl());

    UserRoleMapService userRoleMapService = new UserRoleMapServiceImpl(new UserRoleMapDaoImpl());
    RoleMenuMapService roleMenuMapService = new RoleMenuMapServiceImpl(new RoleMenuMapDaoImpl());

    /**
     * 接受从首页发送过来的登陆请求，跳转到登录页面
     * /login?act=toLogin
     * @param request
     * @param response
     * @return
     */
    public String toLogin(HttpServletRequest request,HttpServletResponse response){
        // System.out.println("登陆Servlet的toLogin方法已被调用！！！");
        return "login.jsp";
    }

    /**
     * 接受从登录页面发送过来的表单提交，进行信息校验
     * /login?act=loginAction
     * @param request
     * @param response
     */
    public void loginAction(HttpServletRequest request,HttpServletResponse response) throws IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 到底应该怎么判断？？？？
        User user = userService.getUserByInfo(username, password);
        System.out.println("查询的结果：" + user);

        // 没查到用户信息，重定向到上面的跳转登陆页
        if(user == null) response.sendRedirect(request.getContextPath() + "/login?act=toLogin");
        // 如果用户的状态是0，表示禁用，则也不允许登陆
        else if (user.getU_status() == 0) response.sendRedirect(request.getContextPath() + "/login?act=toLogin");

        // 以上都通过才开始放行
        HttpSession session = request.getSession();
        session.setAttribute("uid",user.getU_id());

        // 那么接下来应该重定向到一个 转发进homePage的act方法【表示登陆成功】
        response.sendRedirect(request.getContextPath() + "/login?act=toHomePage");

        // Session在会话中保存了用户编号，通过用户的编号查询到可以使用的菜单，然后返回给homePage即可
        // 另外这里到底怎么使用业务层来完成上述的功能？？？
    }

    /**
     * 前往用户主页
     * /login?act=toHomePage
     * @param request
     * @param response
     * @return
     */
    public String toHomePage(HttpServletRequest request,HttpServletResponse response){

        // 上面的Session中存放了用户编号，在这里可以获取到
        Object uid = request.getSession().getAttribute("uid");
        System.out.println("从Session中获取到的用户编号：" + uid);

        // 这里的Object强转Integer即可，我还以为一定要先转换String再给Integer处理
        User userById = userService.getUserById((Integer)uid);

        UserRoleMap userRoleMap = userRoleMapService.getAvailableRidByUid((Integer) uid);
        Role role = roleService.getRoleById(userRoleMap.getRole_id());

        List<Menu> menusOwnedByThisRole = menuService.getMenusOwnedByThisRole(userRoleMap.getRole_id());


        request.setAttribute("user",userById);
        request.setAttribute("role",role);
        request.setAttribute("menus",menusOwnedByThisRole);

        return "/WEB-INF/commons/homePage.jsp";
    }


    /**
     * 退出登录，注销
     * /login?act=toLogout
     * @param request
     * @param response
     */
    public void toLogout(HttpServletRequest request,HttpServletResponse response) throws IOException {
        // 请Session立刻超时，然后浏览器自动销毁
        request.getSession().invalidate();
        // 然后跳转到首页
        response.sendRedirect(request.getContextPath() + "/");
    }





}
